
#define FILE_MAP_DI_DO

#include "map_di_do.h"

/*************************************************************************************************
# Function : di_do_port_init
# Descriptions :
#	Initialize DO and DI port (include diagnostic port)
# Input :
#	None
# Output :
#	None
# Return :
#	None
# Others :
#	None
# History :
#	1. Author : decorn		Version : V1.0		Date : 2017-08-10
#		Modification: Create
#	2. 
#---------------------------------------------------------*/
void di_do_port_init(void)//初始化DI/DO的端口
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
	
	/* DI Port Initial */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;   //DI8
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = (uint32_t)(GPIO_Pin_6 | GPIO_Pin_7);  //DI9  DI10
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	/* DO Port Initial */
	GPIO_InitStructure.GPIO_Pin = (uint32_t)(GPIO_Pin_3  | GPIO_Pin_4 | GPIO_Pin_5);  //DO2-3-4
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	//GPIO_InitStructure.GPIO_Pin = (uint32_t)(GPIO_Pin_0| GPIO_Pin_1);
	//GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/* Diag Port */
	do_diag_port_init();
	di_diag_port_init();
}

/*************************************************************************************************
# Function : do_diag_port_init
# Descriptions :
#	Initialize DO diagnostic port
# Input :
#	None
# Output :
#	None
# Return :
#	None
# Others :
#	PB1 -> CONA
#	PB7 -> CONB
#	PB6 -> CONC
# History :
#	1. Author : decorn		Version : V1.0		Date : 2017-08-10
#		Modification: Create
#	2. 
#---------------------------------------------------------*/
static void do_diag_port_init(void)//模拟开关控制口初始化CONA,CONB,CONC
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
	
	/* Anolog switch Port Initial */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOB, (uint16_t)GPIO_InitStructure.GPIO_Pin);
}

/*************************************************************************************************
# Function : do_diag_sw_set
# Descriptions :
#	Set DO diagnostic analog switch
# Input :
#	None
# Output :
#	None
# Return :
#	None
# Others :
#	PB1 -> CONA
#	PB7 -> CONB
#	PB6 -> CONC
# History :
#	1. Author : decorn		Version : V1.0		Date : 2017-08-10
#		Modification: Create
#	2. 
#---------------------------------------------------------*/
void do_diag_sw_set(uint8_t u8_ch_no)//模拟开关操作，选通道
{
	switch(u8_ch_no){
	case 0u : {
		/* 44+64 或 34+54 summary current  000 ADC0 */
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);
		GPIO_ResetBits(GPIOB, GPIO_Pin_7);
		GPIO_ResetBits(GPIOB, GPIO_Pin_6);
		break;
	}
	case 1u : {
		/* 44 或 54 current 001 ADC1*/
		GPIO_SetBits(GPIOB, GPIO_Pin_1);
		GPIO_ResetBits(GPIOB, GPIO_Pin_7);
		GPIO_ResetBits(GPIOB, GPIO_Pin_6);
		break;
	}
	case 2u : {
		/* 34 或 64 current 010  ADC2 */
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);
		GPIO_SetBits(GPIOB, GPIO_Pin_7);
		GPIO_ResetBits(GPIOB, GPIO_Pin_6);
		break;
	}
	case 3u : {
		/* 44 Voltage 011 ADC3*/
		GPIO_SetBits(GPIOB, GPIO_Pin_1);
		GPIO_SetBits(GPIOB, GPIO_Pin_7);
		GPIO_ResetBits(GPIOB, GPIO_Pin_6);
		break;
	}
	case 4u : {
		/* 64 Voltage 100 ADC4,*/
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);
		GPIO_ResetBits(GPIOB, GPIO_Pin_7);
		GPIO_SetBits(GPIOB, GPIO_Pin_6);
		break;
	}
	case 5u : {
		/* 54 Voltage 101 ADC5*/
		GPIO_SetBits(GPIOB, GPIO_Pin_1);
		GPIO_ResetBits(GPIOB, GPIO_Pin_7);
		GPIO_SetBits(GPIOB, GPIO_Pin_6);
		break;
	}
	case 6u : {
		/* 34 Voltage 110 ADC6 */
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);
		GPIO_SetBits(GPIOB, GPIO_Pin_7);
		GPIO_SetBits(GPIOB, GPIO_Pin_6);
		break;
	}
	case 7u : {
		/* not connect */
		GPIO_SetBits(GPIOB, GPIO_Pin_1);
		GPIO_SetBits(GPIOB, GPIO_Pin_7);
		GPIO_SetBits(GPIOB, GPIO_Pin_6);
		break;
	}
	default :{
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);
		GPIO_ResetBits(GPIOB, GPIO_Pin_7);
		GPIO_ResetBits(GPIOB, GPIO_Pin_6);
		break;
	}
	}
}

/*************************************************************************************************
# Function : di_diag_port_init
# Descriptions :
#	Initialize DI diagnostic port
# Input :
#	None
# Output :
#	None
# Return :
#	None
# Others :
#	None
# History :
#	1. Author : decorn		Version : V1.0		Date : 2017-08-10
#		Modification: Create
#	2. 
#---------------------------------------------------------*/
static void di_diag_port_init(void) //DI诊断脉冲IO口初始化
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);	 /* enable GPIOC clock */
	
	/* DI pulse test Port Initial */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA, (uint16_t)GPIO_InitStructure.GPIO_Pin);
}

/*************************************************************************************************
# Function : di_get_dat
# Descriptions :
#	Get DI current value
# Input :
#	None
# Output :
#	u32p_dat	: DI value
# Return :
#	None
# Others :
#	DI1 -> PB11
#	DI2 -> PB10
#	DI3 -> PB3
#	DI4 -> PA15
#	DI5 -> PF6
#	DI6 -> PF7
 FFFFFFF 00  000000
 
# History :
#	1. Author : decorn		Version : V1.0		Date : 2017-08-10
#		Modification: Create
#	2. 
#---------------------------------------------------------*/
void di_get_dat(uint16_t *u16p_dat)//读取DI端口值
{
	uint16_t u16lv_port_dat	= 0u;
	uint16_t u16lv_port_tmp	= 0u;
	uint16_t u16lv_di_dat	= 0u;
	
	u16lv_di_dat	= 0u;
	u16lv_port_dat	=  GPIO_ReadInputData(GPIOB);
	u16lv_port_tmp	= (uint16_t)(u16lv_port_dat >> 11u) & 0x0001u;   //	CH1--B11
	u16lv_di_dat	  =  u16lv_di_dat | u16lv_port_tmp;
	u16lv_port_tmp	= (uint16_t)(u16lv_port_dat >> 9u) & 0x0002u;    //CH2---B10
	u16lv_di_dat	  =  u16lv_di_dat | u16lv_port_tmp;
	u16lv_port_tmp	= (uint16_t)(u16lv_port_dat >> 0u) & 0x0004u;    //CH3---B2
	u16lv_di_dat	  =  u16lv_di_dat | u16lv_port_tmp;
	u16lv_port_tmp	= (uint16_t)(u16lv_port_dat >> 9u)  & 0x0008u;   //CH4---B12
	u16lv_di_dat	  =  u16lv_di_dat | u16lv_port_tmp;
	u16lv_port_tmp	= (uint16_t)(u16lv_port_dat >> 9u)  & 0x0010u;   //CH5---B13
	u16lv_di_dat	  =  u16lv_di_dat | u16lv_port_tmp;
	u16lv_port_tmp	= (uint16_t)(u16lv_port_dat >> 9u)  & 0x0020u;   //CH6---B14
	u16lv_di_dat	  =  u16lv_di_dat | u16lv_port_tmp;
	u16lv_port_tmp	= (uint16_t)(u16lv_port_dat >> 9u)  & 0x0040u;   //CH7---B15
	u16lv_di_dat	  =  u16lv_di_dat | u16lv_port_tmp;
	
	u16lv_port_dat	= GPIO_ReadInputData(GPIOF);
	u16lv_port_tmp	= (uint16_t)(u16lv_port_dat << 1u) & 0x0080u;    //CH8---F6   8
	u16lv_di_dat	  =  u16lv_di_dat | u16lv_port_tmp;
	
	u16lv_port_dat	=  GPIO_ReadInputData(GPIOA);
	u16lv_port_tmp	= (uint16_t)(u16lv_port_dat >> 7u) & 0x0100u;    //CH9---A15
	u16lv_di_dat	= u16lv_di_dat | u16lv_port_tmp;	
	
	u16lv_port_dat	= GPIO_ReadInputData(GPIOF);
	u16lv_port_tmp	= (uint16_t)(u16lv_port_dat << 2u) & 0x0200u;    ///CH10---F7
	u16lv_di_dat	= u16lv_di_dat | u16lv_port_tmp;
	
	*u16p_dat = u16lv_di_dat;
}

/*************************************************************************************************
# Function : do_set_dat
# Descriptions :
#	Set DO Port value
# Input :
#	u32p_dat	: DO value
# Output :
#	None
# Return :
#	None
# Others :

#	DO1 -> PA8 (is used to DI diagnostic)
#	DO2 -> PB3
#	DO3 -> PB4
#	DO4 -> PB5
# History :
#	1. Author : decorn		Version : V1.0		Date : 2017-08-10
#		Modification: Create
#	2. 
#---------------------------------------------------------*/
void do_set_dat(const uint16_t *u16p_dat)  //设置输出-zhouht
{
	uint16_t u16lv_do_dat	= *u16p_dat;
	/* DO1 */
//	if((u16lv_do_dat & U16_SET_BIT[0u]) == 0u)
//	{
//		GPIO_ResetBits(GPIOA, GPIO_Pin_0);
//	}
//	else
//	{
//		GPIO_SetBits(GPIOA, GPIO_Pin_0);
//	}
//	/* DO2 */
//	if((u16lv_do_dat & U16_SET_BIT[1u]) == 0u){
//		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
//	}
//	else{
//		GPIO_SetBits(GPIOA, GPIO_Pin_1);
//	}
	/* DO3 */
	/* Not used */
	
	
	/* DO4 */  //3
	if((u16lv_do_dat & U16_SET_BIT[3u]) == 0u){  
		GPIO_ResetBits(GPIOB, GPIO_Pin_3);
	}
	else{
		GPIO_SetBits(GPIOB, GPIO_Pin_3);
	}
	/* DO5 */
	if((u16lv_do_dat & U16_SET_BIT[4u]) == 0u){
		GPIO_ResetBits(GPIOB, GPIO_Pin_4);
	}
	else{
		GPIO_SetBits(GPIOB, GPIO_Pin_4);
	}
	/* DO6 */
	if((u16lv_do_dat & U16_SET_BIT[5u]) == 0u){
		GPIO_ResetBits(GPIOB, GPIO_Pin_5);
	}
	else{
		GPIO_SetBits(GPIOB, GPIO_Pin_5);
	}
}

